# final-work
# Описание проекта
Финальный проект являет собой систему для получения, обработки, хранения и предоставления данных пользователю из паблика социальной сети Вконтакте.

# Мотивация
Я -- администратор паблика вк с котами. Занимаюсь им с 2018 года и набрал аудиторию в 55к человек. Ежедневно подписчики генерируют множество реакций (до 300к просмотров и 50к лайков в пике в сутки), мне нужна аналитика, чтобы сделать контент и рекламу более эффективными. Например, я смогу отслеживать людей, которые отписались от группы и тех, кто подписался и является активным пользователем, на основе этих двух групп я смогу использовать ML, чтобы понять каким пользователям давать рекламу, а каким нет. Еще остро стоит вопрос воровства контента другими пабликами. При помощи аналитической платформы, я смогу находить подозрительных пользователей и блокировать их в автоматическом режиме.

# Как это работает?
**! Важное замечание: ссылка на паблик с котами и ссылка на демо проекта будут прикреплены, как комментарий на edu-платформе, если их там нет, то они обязательно появятся через пару дней !**

ВК имеет Callback API (https://dev.vk.com/ru/api/callback/getting-started). С его помощью можно получать мгновенные оповещения о событиях в паблике.

*Например, в данной работе происходит обработка 6-ти типов событий:*
* пользователь поставил лайк
* пользователь убрал лайк
* пользователь вступил в группу
* пользователь вышел из группы
* пользователь оставил комментарий
* пользователь  сделал репост

*Проект состоит из следующих сервисов:*
* **Event-worker** -- http-сервер + kafka-producer. Принимает post-запросы с событиями из паблика, парсит их, конвертирует в унифицированный формат. Также Callback API требует время от времени присылать confirmation code по запросу, event-worker с этим справляется. После обработки события отправляются в Kafka. Имя топика = тип пришедшего события.
* **Storage-worker** -- kafka-consumer + postgres-writer. Занимается чтением очереди Kakfa. Имеет настраиваемую возможность чтения заданных топиков (задается через конфиг). То есть, присутствует возможность поднятия нескольких инстансов сервиса, каждый из которых будет читать свои топики. Сообщения из топиков читаются через стрим батчами (размер батча также конфигурируется), есть возможность задать предельное время, когда будут прочитаны сообщения из очереди, если сообщений меньше, чем размер батча. После того, как сообщения прочитаны, происходит обогащение данных, например, для пользователя, совершившего действите в паблике, подтягивается дополнительная информация (через vk-api: https://dev.vk.com/ru/method): имя и фамилия, открытый профиль или закрытый и т.д. После обогащения, сообщения распределяются по соответсвующим таблицам в postgres.
* **Backoffice-worker** -- postgres-reader + http-сервер. Отдает данные frontend'у. Реализует API, в котором отдает необходимые данные. Поддерживает фильтрацию по дате и пагинацию.

*Дополнительные модули:*
* **core** -- содержит модель данных
* **postgres** -- инструмены для работы с БД
* **deploy** -- тут должен быть CI для проекта, но пока только схема бд-таблиц
* **frontend** -- находится в отдельном репозитории, написан на react

# Какие библиотеки были использованы?
* ZIO, как основная библиотека
* zio-kafka и zio-streams для работы с кафка
* zio-config и zio-json для конфига и парсинга
* com.vk.api.sdk официальная java библиотека для работы с vk-API
* io.getquill.quill-jdbc-zio и org.postgresql.postgresql для работы c postgres

# Что дальше?
Проект еще очень сырой. Я, к сожалению, не успел добавить тесты, обработку ошибок и метрики. Следующим шагом будет реализация этих вещей и рефакторинг.

